﻿using System;
using System.Data.Common;
using System.Linq;
using Acamps.Framework.BancoDados;
using Acamps.Framework.SessionFactory;

namespace Acamps.Framework.NegocioRegras
{
    public class EvangelhoNegocio
    {
         private AcessoDados _acessoDados;

         internal EvangelhoNegocio(string conexao)
         {
             _acessoDados = new AcessoDados(conexao);
         }

        public IQueryable<Evangelho> ListarEvangelhos()
        {
            return _acessoDados.Entidade.Evangelhoes.OrderBy(x => x.Data);
        }

        public Evangelho RecuperarEvangelho(Guid id)
        {
            var evangelho = _acessoDados.Entidade.Evangelhoes.FirstOrDefault(x => x.Id == id);

            if (evangelho != null)
            {
                if (evangelho.ComentarioEvangelhoes.IsLoaded) evangelho.ComentarioEvangelhoes.Load();
            }

            return evangelho;
        }

        public Evangelho Salvar(Evangelho evangelho, ComentarioEvangelho comentarioEvangelho)
        {
            try
            {
                evangelho.Id = Guid.NewGuid();
                _acessoDados.Entidade.AddToEvangelhoes(evangelho);

                comentarioEvangelho.Id = Guid.NewGuid();
                comentarioEvangelho.IdEvangelho = evangelho.Id;
                _acessoDados.Entidade.AddToComentarioEvangelhoes(comentarioEvangelho);

                _acessoDados.Entidade.SaveChanges();

                return evangelho;
            }
            catch (Exception ex)
            {
                throw new Exception("Problema ao salvar o evangelho. Erro: " + ex.Message);
            }
        }

        public Evangelho Editar(Evangelho evangelho, ComentarioEvangelho comentarioEvangelho)
        {
            var evangelhoRet = RecuperarEvangelho(evangelho.Id);


            try
            {
                evangelhoRet.Titulo = evangelho.Titulo;
                evangelhoRet.Leitura = evangelho.Leitura;
                evangelhoRet.Evangelho1 = evangelho.Evangelho1;

                evangelhoRet.ComentarioEvangelhoes.FirstOrDefault().TituloComentario = comentarioEvangelho.TituloComentario;
                evangelhoRet.ComentarioEvangelhoes.FirstOrDefault().LeituraComentario = comentarioEvangelho.LeituraComentario;
                evangelhoRet.ComentarioEvangelhoes.FirstOrDefault().Comentario = comentarioEvangelho.Comentario;

                _acessoDados.Entidade.SaveChanges();

                return evangelho;
            }
            catch (Exception ex)
            {
                throw new Exception("Problema ao alterar o evangelho. Erro: " + ex.Message);
            }
        }

        public bool VerificarEvangelhoDia()
        {
            return _acessoDados.Entidade.Evangelhoes.Any(x => x.Data.Value.Day == DateTime.Now.Day && x.Data.Value.Month == DateTime.Now.Month
                                                            && x.Data.Value.Year== DateTime.Now.Year);
        }

        public Evangelho RecuperarEvangelhoDia()
        {
            var evangelho = _acessoDados.Entidade.Evangelhoes.FirstOrDefault(x => x.Data.Value.Day == DateTime.Now.Day && x.Data.Value.Month == DateTime.Now.Month
                                                            && x.Data.Value.Year == DateTime.Now.Year);
            if (evangelho != null)
            {
                if (evangelho.ComentarioEvangelhoes.IsLoaded) evangelho.ComentarioEvangelhoes.Load();
            }

            return evangelho;
        }

        public Evangelho RecuperarEvangelhoDia(DateTime dataEvangelho)
        {
            var evangelho = _acessoDados.Entidade.Evangelhoes.FirstOrDefault(x => x.Data.Value.Day == dataEvangelho.Day && x.Data.Value.Month == dataEvangelho.Month
                                                            && x.Data.Value.Year == dataEvangelho.Year);
            if (evangelho != null)
            {
                if (evangelho.ComentarioEvangelhoes.IsLoaded) evangelho.ComentarioEvangelhoes.Load();
            }

            return evangelho;
        }
    }
}
